/*
 * Bucket.h
 *
 *  Created on: 30/10/2011
 *      Author: damnvb
 */

#ifndef BUCKET_H_
#define BUCKET_H_

#include "Registro.h"
#include <vector>

using namespace std;

class Bucket {

public:

	static unsigned int TAMANIO_BUCKET;
	static 			int REG_NO_EN_BUCKET;
	static 			int REG_NO_ENTRA;
	static 			int REG_MAYOR_QUE_BUCKET;
	static 			int RES_OK;
	static 			int RES_ERROR;

	/* Crea un bloque vacio en memoria con el tamaño de dispersión indicado*/
	Bucket(unsigned int tamanioDispersion);

	/* Crea un bloque en memoria y le carga los datos leidos en la posicion del nro bloque del archivo 'path' */
	Bucket(string path,int nroBloque);

	/* Busca el registro con el ID del registro recibido
	 * en el bloque. Carga el registro recibido con la
	 * informacion leida y lo devuelve*/
	int buscar(Registro* registro);

	/* Borra el registro del bloque y lo devuelve por parámetro.
	 * Si logró borrar actualiza el campo espacio_libre*/
	int borrar(Registro* registro);

	/* Borra todos los registros de un bloque ya cargado en memoria
	 * y devuelva un vector de registros (es para redispersar los registros cuando un
	 * bloque se desborda)*/
	vector<Registro*> vaciar();

	/* Inserta el registro en el bloque, devuelve true si alcanzo el espacio libre y false si no
	 * NO persiste en disco rigido
	 * IMPORTANTE: si el registro a insertar ya estaba en el bloque, reemplaza el registro
	 * viejo por el nuevo */
	int insertar(Registro* registro);

	/* Guarda el bloque en disco en el archivo y offset indicados */
	int persistir(string path, int nroBloque);

	string serializar();
	void deserializar(string datos);

	/* ---------------------------------------- GETTERS / SETTERS ------------------------------*/

	static int getTamanioBloques();

	unsigned int getTamanioDispersion();

	void setTamanioDispersion(unsigned int tamanioDispersion);

	unsigned int getEspacioLibre();

	unsigned int getCantidadRegistros();

	vector<Registro*> getMemoria();

	virtual ~Bucket();

private:

//	unsigned int tamanioBucket;
	unsigned int espacioLibre;
	unsigned int cantidadRegistros;
	unsigned int tamanioDispersion;
	vector<Registro*> memoria;

	void setEspacioLibre(unsigned int size);

};

#endif /* BUCKET_H_ */
